package com.framework.dao.rdao;

import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Set;

/**
 * 基础数据库操作类 其他RedisDao继承此类获取常用的数据库操作方法，基本上你能用到的方法这里都有了，不需要自己建立DAO了。
 *
 * @author 刘佳佳
 * @param <T>
 *            模型
 */
@Repository("redisDao")
public interface RedisDaoI<T> {

	/**
	 * 检查是否连接成功
	 *
	 * @return
	 */
	public String ping() throws Exception;

	/**
	 * 通过key删除（字节）
	 *
	 * @param key
	 */
	public void del(byte[] key) throws Exception;

	/**
	 * 通过key删除
	 *
	 * @param key
	 */
	public void del(String key) throws Exception;

	/**
	 * 添加key value 并且设置存活时间(byte)
	 *
	 * @param key
	 * @param value
	 * @param liveTime
	 */
	public void set(byte[] key, byte[] value, int liveTime) throws Exception;

	/**
	 * 添加key value 并且设置存活时间
	 *
	 * @param key
	 * @param value
	 * @param liveTime
	 */
	public void set(String key, String value, int liveTime) throws Exception;

	/**
	 * 添加key value
	 *
	 * @param key
	 * @param value
	 */
	public void set(String key, String value) throws Exception;

	/**
	 * 添加key value (字节)(序列化)
	 *
	 * @param key
	 * @param value
	 */
	public void set(byte[] key, byte[] value) throws Exception;

	/**
	 * 获取redis value (String)
	 *
	 * @param key
	 * @return
	 */
	public String get(String key) throws Exception;

	/**
	 * key的失效时间
	 * @param key
	 * @return 秒
	 */
	public Long ttl(String key) throws Exception;

	/**
	 * 加锁
	 * @param key
	 * @param value
	 * @param expireTime
	 * @return
	 */
	public String setex(String key, String value, int expireTime);

	/**
	 * 加锁
	 * @param key
	 * @param value
	 * @return
	 */
	public Long setnx(String key, String value);

	/**
	 * 获取redis value (byte [] )(反序列化)
	 *
	 * @param key
	 * @return
	 */
	public byte[] get(byte[] key) throws Exception;

	/**
	 * 通过正则匹配keys
	 *
	 * @param pattern
	 * @return
	 */
	public Set<String> keys(String pattern) throws Exception;

	/**
	 * 检查key是否已经存在
	 *
	 * @param key
	 * @return
	 */
	public boolean exists(String key) throws Exception;

	/**
	 * 清空redis 所有数据
	 *
	 * @return
	 */
	public String flushDB() throws Exception;

	/**
	 * 查看redis里有多少数据
	 */
	public long dbSize() throws Exception;

	/**
	 * 追加key value
	 *
	 * @param key
	 * @param value
	 */
	public void append(String key, String value) throws Exception;

	/**
	 * 追加key value (字节)(序列化)
	 *
	 * @param key
	 * @param value
	 */
	public void append(byte[] key, byte[] value) throws Exception;

	/**
	 * 向一个集合中添加一个元素 key value (字节)(序列化)
	 *
	 * @param key
	 * @param value
	 */
	public void sadd(byte[] key, byte[] value) throws Exception;

	/**
	 * 向一个集合中添加一个元素 key value (字节)(序列化)
	 *
	 * @param key
	 * @param value
	 */
	public void plull(byte[] key, byte[] value) throws Exception;


	public void rpush(byte[] key, byte[] value) throws Exception;

	public List<byte[]> lrange(byte[] key, int start, int end) throws Exception;

	/**
	 * 设置key超时
	 * @param key
	 * @param seconds
	 * @throws Exception
	 * @return
	 */
	public Long expire(String key , int seconds) throws Exception;

	public Long expire(byte [] key , int seconds) throws Exception;

//（2）smembers
//    查看集合中的所有元素。例如：smembers set1
//
//（3）srem
//    删除集合中一个指定的元素。例如：srem set1 Hello
//
//（4）spop
//    随机弹出set集合中德一个元素。例如：spop set1
//
//（5）sdiff
//    求两个集合的差集，比如sdiff set1 set2，表示保留set1中与set2不同的所有元素。
//
//（6）sdiffstore
//    将返回的差集存进一个集合。例如：sdiffstore set3 set1 set2，表示把set1与set2的差集存进
//    集合set3。
//
//（7）sinter
//    返回给定两个集合的交集。例如：sinter set1 set2，表示返回set1和set2的交集。
//
//（8）sinterstore
//    将两个集合的交集存进一个集合。例如：sinterstore set3 set1 set2，表示把set1和set2的交集
//    存进集合set3。
//
//（9）sunion
//    返回给定两个集合的并集。例如：sunion set1 set2，表示返回set1和set2的并集。
//
//（10）sunionstore
//    将两个集合的并集存进一个集合。例如：sunionstore set3 set1 set2，表示把set1和set2的并集
//    存进集合set3
//
//（11）smove
//    从第一个key对应的set中移除member并添加到第二个对应的集合中。
//    例如：smove set1 set2 Hello，表示把set1中的Hello元素移动到set2中。
//
//（12）scard
//    返回key对应集合的元素的个数。例如：scard set1。
//
//（13）sismember
//    判断某一个元素是否为集合的元素。比如：sismember set1 Hello，表示判断Hello是否为set1的中
//    的元素。
//
//（14）srandmember
//    随机返回名称为key的set的一个元素。例如：srandmember set1。



}
